; This is the kernel's entry point. We could either call main here,
; or we can use this to setup the stack or other nice stuff, like
; perhaps setting up the GDT and segments. Please note that interrupts
; are disabled at this point: More on interrupts later!
[BITS 32]
global start
start:
    mov esp, _sys_stack     ; This points the stack to our new stack area
    jmp stublet

; This part MUST be 4byte aligned, so we solve that issue using 'ALIGN 4'
ALIGN 4
mboot:
    ; Multiboot macros to make a few lines later more readable
    MULTIBOOT_PAGE_ALIGN	equ 1<<0
    MULTIBOOT_MEMORY_INFO	equ 1<<1
    MULTIBOOT_AOUT_KLUDGE	equ 1<<16
    MULTIBOOT_HEADER_MAGIC	equ 0x1BADB002
    MULTIBOOT_HEADER_FLAGS	equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO | MULTIBOOT_AOUT_KLUDGE
    MULTIBOOT_CHECKSUM	equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
    EXTERN code, bss, end

    ; This is the GRUB Multiboot header. A boot signature
    dd MULTIBOOT_HEADER_MAGIC
    dd MULTIBOOT_HEADER_FLAGS
    dd MULTIBOOT_CHECKSUM
    
    ; AOUT kludge - must be physical addresses. Make a note of these:
    ; The linker script fills in the data for these ones!
    dd mboot
    dd code
    dd bss
    dd end
    dd start

; This is an endless loop here. Make a note of this: Later on, we
; will insert an 'extern _main', followed by 'call _main', right
; before the 'jmp $'.
stublet:
    extern main
    call   main
    jmp $


; Shortly we will add code for loading the GDT right here!
; This is Dr. Reese's GDT stuff....

GLOBAL ISR_PIC1
ISR_PIC1: PUSH EAX
MOV AL,20h
OUT 020h,AL
POP EAX
IRET
GLOBAL ISR_PIC2
ISR_PIC2: PUSH EAX
MOV AL,20h
OUT 020h,AL
OUT 0A0h,AL
POP EAX
IRET
SECTION .data
;----------------------------------------------------------------------------
;Global Descriptor Table (GDT)
;----------------------------------------------------------------------------
gdt_info: DW (3*8)-1; 16-bit GDT limit
DD gdt ; 32-bit GDT address
gdt:
null_descriptor:
DW 0 ; seg length <0..15>
DW 0 ; base address <0..15>
DB 0 ; base address <16..23>
DB 0 ; seg type and misc flags
DB 0 ; seg length <16..19> & access flags
DB 0 ; base address <24..31>
code_descriptor:
DW 0FFFFh ; seg length <0..15>
DW 0 ; base address <0..15>
DB 0 ; base address <16..23>
DB 09Ah ; seg type and misc flags
DB 0CFh ; seg length <16..19> & access flags
DB 0 ; base address <24..31>
data_descriptor:
DW 0FFFFh ; seg length <0..15>
DW 0 ; base address <0..15>
DB 0 ; base address <16..23>
DB 092h ; seg type and misc flags
DB 0CFh ; seg length <16..19> & access flags
DB 0 ; base address <24..31>
CODE_SELECTOR EQU code_descriptor - gdt
DATA_SELECTOR EQU data_descriptor - gdt
GLOBAL code_selector ; (Needed in init-idt.c)
code_selector: DW CODE_SELECTOR


; In just a few pages in this tutorial, we will add our Interrupt
; Service Routines (ISRs) right here!



; Here is the definition of our BSS section. Right now, we'll use
; it just to store the stack. Remember that a stack actually grows
; downwards, so we declare the size of the data before declaring
; the identifier '_sys_stack'
SECTION .bss
    resb 8192               ; This reserves 8KBytes of memory here
_sys_stack:
